Moq হলো .NET অ্যাপ্লিকেশনের জন্য একটি জনপ্রিয় Mocking Framework, যা Unit Testing এর সময় ডিপেনডেন্সি মক করার সুবিধা প্রদান করে। এটি বিশেষভাবে Dependency Injection ভিত্তিক অ্যাপ্লিকেশনের জন্য কার্যকর। Moq Framework ব্যবহার করে, আপনি ডিপেনডেন্ট অবজেক্টের মক (Mock) তৈরি করতে পারেন এবং তাদের আচরণ নিয়ন্ত্রণ করতে পারেন।
Unit Testing-এ মকিং ব্যবহারের মাধ্যমে আপনি External Dependencies (যেমন ডাটাবেস, API, বা সার্ভিস) সরিয়ে ফেলে শুধুমাত্র টেস্ট করা ক্লাসের কার্যকলাপ নিশ্চিত করতে পারেন।
Moq Framework ব্যবহার করার জন্য NuGet Package Manager বা dotnet CLI
ব্যবহার করে প্যাকেজ ইন্সটল করতে পারেন:
Visual Studio এর NuGet Package Manager থেকে Moq
ইনস্টল করুন।
dotnet add package Moq
Moq সাধারণত ইন্টারফেসের উপর কাজ করে, কারণ মক করার জন্য এটি ডিপেনডেন্সি ইনজেকশন ব্যবহার করে।
উদাহরণস্বরূপ, একটি IUserRepository
ইন্টারফেস যেখানে ডেটাবেস অপারেশন থাকে:
public interface IUserRepository
{
User GetUserById(int id);
void AddUser(User user);
}
UserService
ক্লাস, যেখানে IUserRepository
এর উপর নির্ভরশীলতা রয়েছে:
public class UserService
{
private readonly IUserRepository _userRepository;
public UserService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public string GetUserNameById(int id)
{
var user = _userRepository.GetUserById(id);
return user != null ? user.Name : "User not found";
}
}
UserService
ক্লাসের জন্য Unit Test লিখতে হবে। এখানে আমরা Moq ব্যবহার করে IUserRepository
মক করব।
using Moq;
using Xunit;
public class UserServiceTests
{
[Fact]
public void GetUserNameById_UserExists_ReturnsUserName()
{
// Arrange
var mockUserRepository = new Mock<IUserRepository>();
mockUserRepository.Setup(repo => repo.GetUserById(1))
.Returns(new User { Id = 1, Name = "John Doe" });
var userService = new UserService(mockUserRepository.Object);
// Act
var result = userService.GetUserNameById(1);
// Assert
Assert.Equal("John Doe", result);
}
[Fact]
public void GetUserNameById_UserDoesNotExist_ReturnsUserNotFound()
{
// Arrange
var mockUserRepository = new Mock<IUserRepository>();
mockUserRepository.Setup(repo => repo.GetUserById(2))
.Returns((User)null);
var userService = new UserService(mockUserRepository.Object);
// Act
var result = userService.GetUserNameById(2);
// Assert
Assert.Equal("User not found", result);
}
}
var mockUserRepository = new Mock<IUserRepository>();
Moq ব্যবহার করে IUserRepository
এর একটি মক ইন্সট্যান্স তৈরি করা হয়েছে।
mockUserRepository.Setup(repo => repo.GetUserById(1))
.Returns(new User { Id = 1, Name = "John Doe" });
GetUserById(1)
মেথডটি কল হলে এটি একটি নির্দিষ্ট মান User
ফেরত দেবে।
var userService = new UserService(mockUserRepository.Object);
মক করা অবজেক্ট userService
এর কনস্ট্রাক্টরে পাস করা হয়েছে।
Assert.Equal("John Doe", result);
পরীক্ষা করা হচ্ছে যে GetUserNameById(1)
মেথডটি সঠিক ফলাফল ফেরত দিচ্ছে কিনা।
Moq দিয়ে নিশ্চিত করা যায় যে একটি নির্দিষ্ট মেথড নির্দিষ্ট সংখ্যক বার কল করা হয়েছে কিনা।
mockUserRepository.Verify(repo => repo.GetUserById(1), Times.Once);
এটি নিশ্চিত করবে যে GetUserById(1)
শুধুমাত্র একবার কল হয়েছে।
মক মেথড একটি নির্দিষ্ট Exception ছুঁড়তে পারে:
mockUserRepository.Setup(repo => repo.AddUser(It.IsAny<User>()))
.Throws(new Exception("Database error"));
Moq Framework ব্যবহার করে ASP.NET Core অ্যাপ্লিকেশনের Unit Testing সহজ এবং কার্যকর হয়। এটি ডিপেনডেন্ট ক্লাস বা ইন্টারফেসের মক তৈরি করে টেস্টিং-এর সময় এক্সটার্নাল ডিপেনডেন্সি দূর করে। এর ফলে কোডের গুণগত মান বৃদ্ধি পায় এবং টেস্টিং দ্রুত এবং নির্ভরযোগ্য হয়। Moq Framework Unit Testing-এর জন্য একটি অত্যন্ত কার্যকর টুল।
common.read_more